﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CsClient
{
    class PoleMapy
    {
        Wspolrzedne polozenie; //Położenie względem punktu startowego(w układzie naszego agenta).
        int wysokosc; //Wysokość pola w układzie naszego agenta.
        int energia; //Energia obecna na polu. Jeśli -1, to jest nieskończona.
        bool przeszkoda; //Czy pole jest przeszkodą/zajęte.
        Przejscie polnocne, wschodnie, poludniowe, zachodnie; //Przejścia do sąsiadujących pól mapy.

        #region Konstruktory

        public PoleMapy(Wspolrzedne polozenie, int wysokoscPola, int iloscEnergii,
            bool czyJestPrzeszkoda)
        {
            this.polozenie = polozenie;
            wysokosc = wysokoscPola;
            energia = iloscEnergii;
            przeszkoda = czyJestPrzeszkoda;
        }

        public PoleMapy(Wspolrzedne polozenie, int wysokoscPola, int iloscEnergii,
            bool czyJestPrzeszkoda, PoleMapy polnocne, PoleMapy wschodnie, PoleMapy poludniowe,
            PoleMapy zachodnie)
        {
            this.polozenie = polozenie;
            wysokosc = wysokoscPola;
            energia = iloscEnergii;
            przeszkoda = czyJestPrzeszkoda;
            if (!czyJestPrzeszkoda)
            {
                if ((polnocne != null) && (!polnocne.czyJestPrzeszkoda()))
                {
                    this.polnocne = new Przejscie(this, polnocne);
                    polnocne.setPoludniowe(this);
                }
                if (wschodnie != null && (!wschodnie.czyJestPrzeszkoda()))
                {
                    this.wschodnie = new Przejscie(this, wschodnie);
                    wschodnie.setZachodnie(this);
                }
                if (poludniowe != null && (!poludniowe.czyJestPrzeszkoda()))
                {
                    this.poludniowe = new Przejscie(this, poludniowe);
                    poludniowe.setPolnocne(this);
                }
                if (zachodnie != null && (!zachodnie.czyJestPrzeszkoda()))
                {
                    this.zachodnie = new Przejscie(this, zachodnie);
                    zachodnie.setWschodnie(this);
                }
            }
        }

        #endregion

        #region Get'y Set'y

        public Wspolrzedne getPolozenie()
        {
            return polozenie;
        }

        public int getWysokosc()
        {
            return wysokosc;
        }

        public int getEnergia()
        {
            return energia;
        }

        public void setEnergia(int iloscEnergii)
        {
            energia = iloscEnergii;
        }

        public void pobranoEnergie(int pobranaIlosc)
        {
            energia -= pobranaIlosc;
        }

        public bool czyJestPrzeszkoda()
        {
            return przeszkoda;
        }

        public Przejscie getPolnocne()
        {
            return polnocne;
        }

        public Przejscie getWschodnie()
        {
            return wschodnie;
        }

        public Przejscie getPoludniowe()
        {
            return poludniowe;
        }

        public Przejscie getZachodnie()
        {
            return zachodnie;
        }

        public void setPolnocne(PoleMapy polePolnocne)
        {
            this.polnocne = new Przejscie(this, polePolnocne);
        }

        public void setWschodnie(PoleMapy poleWschodnie)
        {
            this.wschodnie = new Przejscie(this, poleWschodnie);
        }

        public void setPoludniowe(PoleMapy polePoludniowe)
        {
            this.poludniowe = new Przejscie(this, polePoludniowe);
        }

        public void setZachodnie(PoleMapy poleZachodnie)
        {
            this.zachodnie = new Przejscie(this, poleZachodnie);
        }

        #endregion

        #region Inne metody

        public bool czySasiadujeZNieznanym()
        {
            PoleMapy test = ZnanaMapa.znajdzPole(this.polozenie.getX(), this.polozenie.getY() + 1);
            if (test == null)
                return true;
            test = ZnanaMapa.znajdzPole(this.polozenie.getX() + 1, this.polozenie.getY());
            if (test == null)
                return true;
            test = ZnanaMapa.znajdzPole(this.polozenie.getX(), this.polozenie.getY() - 1);
            if (test == null)
                return true;
            test = ZnanaMapa.znajdzPole(this.polozenie.getX() - 1, this.polozenie.getY());
            if (test == null)
                return true;
            return false;
        }

        #endregion

    }
}
